<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<link href="style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>过滤器(Filter) － Apache 2.2 中文手册 [金步国]</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
<body id="manual-page">
<div id="page-header"><p class="menu"><a href="mod/index.html">模块索引</a> | <a href="mod/directives.html">指令索引</a> | <a href="faq/index.html">常见问题</a> | <a href="glossary.html">词汇表</a> | <a href="sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="images/feather.gif" /></div>
<div class="up"><a href="index.html"><img title="&lt;-" alt="&lt;-" src="images/left.gif" /></a></div>
<div id="path"><a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">HTTP Server</a> &gt; <a href="https://httpd.apache.org/docs/">文档</a> &gt; <a href="index.html">版本2.2</a></div>

<div id="translation-info">　　 <a href="translator_announcement.html#thanks">致谢</a> | 本篇译者：<a href="../../index.html">金步国</a>(<a href="../../index.html">作品集</a>) | 本页最后更新：2006年10月20日</div>
<div id="page-content"><div id="preamble"><h1>过滤器(Filter)</h1>


    <p>本文阐述Apache中过滤器的用法。</p>
  </div>
	<div class="top"><a href="filter.html#page-header"><img alt="top" src="images/up.gif" /></a></div>
<div class="section">
<h2><a name="intro" id="intro">Apache 2 中的过滤器</a></h2>

    <table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="related">
<tr><th>相关模块</th><th>相关指令</th></tr>
<tr><td><ul><li><code class="module"><a href="mod/mod_filter.html">mod_filter</a></code></li><li><code class="module"><a href="mod/mod_deflate.html">mod_deflate</a></code></li><li><code class="module"><a href="mod/mod_ext_filter.html">mod_ext_filter</a></code></li><li><code class="module"><a href="mod/mod_include.html">mod_include</a></code></li><li><code class="module"><a href="mod/mod_charset_lite.html">mod_charset_lite</a></code></li></ul></td><td><ul><li><code class="directive"><a href="mod/mod_filter.html#filterchain">FilterChain</a></code></li><li><code class="directive"><a href="mod/mod_filter.html#filterdeclare">FilterDeclare</a></code></li><li><code class="directive"><a href="mod/mod_filter.html#filterprotocol">FilterProtocol</a></code></li><li><code class="directive"><a href="mod/mod_filter.html#filterprovider">FilterProvider</a></code></li><li><code class="directive"><a href="mod/mod_mime.html#addinputfilter">AddInputFilter</a></code></li><li><code class="directive"><a href="mod/mod_mime.html#addoutputfilter">AddOutputFilter</a></code></li><li><code class="directive"><a href="mod/mod_mime.html#removeinputfilter">RemoveInputFilter</a></code></li><li><code class="directive"><a href="mod/mod_mime.html#removeoutputfilter">RemoveOutputFilter</a></code></li><li><code class="directive"><a href="mod/mod_ext_filter.html#extfilterdefine">ExtFilterDefine</a></code></li><li><code class="directive"><a href="mod/mod_ext_filter.html#extfilteroptions">ExtFilterOptions</a></code></li><li><code class="directive"><a href="mod/core.html#setinputfilter">SetInputFilter</a></code></li><li><code class="directive"><a href="mod/core.html#setoutputfilter">SetOutputFilter</a></code></li></ul></td></tr>
</table>

<p>Apache 2.0 及以后的版本中使用了过滤器链，使得应用程序能够以高度灵活的、可配置的方式处理进入的数据和输出的数据，而无需关心这些数据来自哪里。我们可以预处理进入的数据和后处理(post-process)输出的数据。这些过程基本上独立于传统的请求处理阶段。</p>
<p class="figure">
<img src="images/filter_arch.gif" width="569" height="392" alt="Filters can be chained, in a Data Axis orthogonal to request processing" />
</p>
<p>标准Apache发行版中的一些过滤器实例：</p>
<ul>
<li><code class="module"><a href="mod/mod_include.html">mod_include</a></code>实现了服务端包含。</li>
<li><code class="module"><a href="mod/mod_ssl.html">mod_ssl</a></code>实现了SSL加密(https)。</li>
<li><code class="module"><a href="mod/mod_deflate.html">mod_deflate</a></code>实现了实时压缩/解压。</li>
<li><code class="module"><a href="mod/mod_charset_lite.html">mod_charset_lite</a></code>在不同的字符集之间自动转换。</li>
<li><code class="module"><a href="mod/mod_ext_filter.html">mod_ext_filter</a></code>将一个外部程序作为过滤器运行。</li>
</ul>
<p>Apache还在内部使用许多过滤器来对请求执行诸如分块、字节层次处理(byte-range handling)等功能。</p>

<p>可以从<a href="http://modules.apache.org/">modules.apache.org</a>或别处得到许多通过第三方过滤器模块实现的应用程序。其中的一些是：</p>

<ul>
<li>HTML和XML处理和重写</li>
<li>XSLT变换XIncludes</li>
<li>XML命名空间支持</li>
<li>文件上传处理和HTML表格解码</li>
<li>图像处理</li>
<li>保护诸如PHP脚本之类的脆弱应用程序</li>
<li>文本搜索和替换编辑</li>
</ul>
</div><div class="top"><a href="filter.html#page-header"><img alt="top" src="images/up.gif" /></a></div>
<div class="section">
<h2><a name="smart" id="smart">智能过虑</a></h2>

<p class="figure">
<img src="images/mod_filter_new.gif" width="423" height="331" alt="Smart filtering applies different filter providers according to the state of request processing" />
</p>
<p>Apache 2.1 及以后的版本中包含的<code class="module"><a href="mod/mod_filter.html">mod_filter</a></code>模块允许过虑器链在运行时进行动态配置。举例来说，你可以在代理无法得到原始服务器发送的初始信息的情况下，安装一个使用不同的过滤器来分别重写HTML、处理JPEG图片的代理。这是通过使用一个过滤器束(filter harness)来工作的，该过虑器束在运行时根据实际内容的不同将任务分配给不同的提供者(provider)。任何一个过滤器都何以被直接插入到过滤器链中并无条件的运行，或者动态的作为一个提供者(provider)插入。例如：</p>
<ul>
<li>HTML处理过滤器仅在内容是text/html或application/xhtml+xml的情况下才运行</li>
<li>压缩过滤器仅在输入是一个未经压缩的可压缩类型的内容的情况下才运行</li>
<li>字符集转换过滤器仅在一个文本文档不是期望的字符集的情况下才被插入</li>
</ul>
</div><div class="top"><a href="filter.html#page-header"><img alt="top" src="images/up.gif" /></a></div>
<div class="section">
<h2><a name="using" id="using">使用过滤器</a></h2>

<p>有两种使用过滤器的方法：简单方法和动态方法。通常，你应当使用两者之一；混合使用它们可能会导致意想不到的后果(虽然简单方法的输入过滤器可以和简单或动态方法的输出过滤器混合使用)。</p>
<p><em>简单方法</em>是配置输出过滤器的唯一方法，并且对于需要静态过滤器链的输出过滤器来说是足够的。相关的指令有：
    <code class="directive"><a href="mod/core.html#setinputfilter">SetInputFilter</a></code>,
    <code class="directive"><a href="mod/core.html#setoutputfilter">SetOutputFilter</a></code>,
    <code class="directive"><a href="mod/mod_mime.html#addinputfilter">AddInputFilter</a></code>,
    <code class="directive"><a href="mod/mod_mime.html#addoutputfilter">AddOutputFilter</a></code>,
    <code class="directive"><a href="mod/mod_mime.html#removeinputfilter">RemoveInputFilter</a></code>,
    <code class="directive"><a href="mod/mod_mime.html#removeoutputfilter">RemoveOutputFilter</a></code> 。</p>

<p><em>动态方法</em>使输出过滤器能够进行静态的或者灵活的动态配置成为可能，详情请参见<code class="module"><a href="mod/mod_filter.html">mod_filter</a></code>模块文档。相关指令有：
    <code class="directive"><a href="mod/mod_filter.html#filterchain">FilterChain</a></code>,
    <code class="directive"><a href="mod/mod_filter.html#filterdeclare">FilterDeclare</a></code>,
    <code class="directive"><a href="mod/mod_filter.html#filterprovider">FilterProvider</a></code> 。</p>

<p>一个更高级的指令<code class="directive"><a href="mod/core.html#addoutputfilterbytype">AddOutputFilterByType</a></code>也被支持，但是可能存在一些问题，目前还不赞成使用它，而代之以动态配置。</p>

  </div></div>
<div id="footer">
<p class="apache">本文允许自由的转载、引用、再分发，但必须保留译者署名并注明出处；详见：<a href="translator_announcement.html#announcement">版权声明</a>。</p>
<p class="menu"><a href="mod/index.html">模块索引</a> | <a href="mod/directives.html">指令索引</a> | <a href="faq/index.html">常见问题</a> | <a href="glossary.html">词汇表</a> | <a href="sitemap.html">站点导航</a></p></div>
</body></html>
